// 动画的封装
function move(ele, date, callback) { 
    clearInterval(ele.t);
    ele.t = setInterval(() => {
        // 假设，计时器从一开始就不应该存在
        let flag = true;
        // 遍历对象，拿到属性和目标
        for (let i in date) {
            let now = parseInt(getStyle(ele, i));
            let speed = (date[i] - now) / 7;
            speed = speed < 0 ? Math.floor(speed) : Math.ceil(speed);
            // 如果一个属性到目标了，先别清除计时器，因为有可能其他属性还没到目标
            // 删除了原本清除计时器的代码
            ele.style[i] = now + speed + "px";
            // 只要有一个属性还没到目标，计时器就要存在
            if (date[i] !== now) {
                flag = false;
            }
        }
        // 如果没有属性没到目标，计时器就真的不应该存在了
        if (flag) {
            clearInterval(ele.t);
            // 动画结束后，要执行的功能
            callback && callback();
        }
    }, 30);
}
function getStyle(ele, arrt) {
    return getComputedStyle ? getComputedStyle(ele)[arrt] : ele.currenStyle[arrt];
}